home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 2000-01-20 | 9.1 KB | 293 lines |
- Set Buffer 100
- Screen Open 0,640,256,2,$8000
- Curs Off : Flash Off : Paper 0 : Pen 1 : Cls
- Dev Open 0,"2nd.scsi.device",128,0,0
- Reserve As Work 9,2048
- ST=Start(9)
- Reserve As Work 10,2048
- ST2=Start(10)
- DISKREAD[ST,512,0]
- If Leek(ST)<> Extension_8_0998("RDSK") Then Print "No RDB-Block!" : Stop
- PARTBLK=Leek(ST+28)
- MXNODES=60000 : MXEXTNODES=MXNODES+10000
- EXTNODECNT=MXNODES
- 'Reserve As Work 16,MXEXTNODES*14
- Extension_8_0456 "bak:nodelist.raw",16
- NODELIST=Start(16)
- 'Reserve As Work 17,MXNODES*30
- Extension_8_0456 "bak:objclist.raw",17
- OBJLIST=Start(17)
- 'Reserve As Work 18,900000
- Extension_8_0456 "bak:objcname.raw",18
- STRBUF=Start(18) : STROFF=0
- Do
- Exit If PARTBLK<1
- DISKREAD[ST,512,PARTBLK]
- If Leek(ST)<> Extension_8_0998("PART") Then Print "Invalid partition" : Stop
- HEADS=Leek(ST+12+128) : BLKPERTRK=Leek(ST+20+128)
- BLKPERCYL=HEADS*BLKPERTRK
- BASE=Leek(ST+36+128)*BLKPERCYL
- NUMBLK=Leek(ST+40+128)*BLKPERCYL-BASE
- Print "PART BLOCK: ";PARTBLK
- DEV$=Peek$(ST+37,Peek(ST+36))
- Print " Device : ";DEV$;":"
- Print " Heads per Cyl.:";HEADS
- Print " Blks per Track:";BLKPERTRK
- Print " First block :";BASE
- Print " Num blocks :";NUMBLK
- PARTBLK=Leek(ST+16)
- DISKREAD[ST,512,BASE]
- If DEV$="REC"
- For A=35000 To MXNODES-1
- XXX=Free
- FDOBJ=OBJLIST+A*30
- OBNODE=Leek(FDOBJ+4)
- If OBNODE=A : Gosub EXAMINE : End If
- Next
- End If
- If DEV$="RECc"
- STBLK=0 : YAHOO=64
- Repeat
- STPRATE=1
- Do
- DISKREAD[ST,512,STBLK*4+BASE]
- If Leek(ST+8)=STBLK
- If STPRATE>1
- Add STBLK,-STPRATE+1
- End If
- YAHOO=32 : Exit
- End If
- Dec YAHOO
- Exit If YAHOO>0
- STPRATE=24
- Add STBLK,STPRATE
- If(STBLK mod 402)=0
- Print(STBLK*400)/NUMBLK;"% ";STPRATE
- End If
- Exit If STBLK*4>NUMBLK,2
- Loop
- DISKREAD[ST,2048,STBLK*4+BASE]
- ID=Leek(ST)
- If ID= Extension_8_0998("BNDC")
- XXX=Free
- Print Extension_8_08D2(ID);" (";STBLK;"=";Leek(ST+8);")"
- NUMNODES=Deek(ST+12)
- ISLEAF=Peek(ST+14)
- NSIZE=Peek(ST+15)
- Print "Nodes :";NUMNODES; Extension_8_16A4(" (noleafs)| (leafs)",ISLEAF);NSIZE
- FDNODE=ST+16
- If ISLEAF=0 : NUMNODES=0 : End If
- While NUMNODES>0
- ' Print "Key:";Leek(FDNODE),"Size:";Deek(FDNODE+12),"Next:";Leek(FDNODE+4),"Prev:";
- OBNODE=Leek(FDNODE+8) and $7FFFFFFF
- If Leek(FDNODE+8)<0
- If OBNODE>MXNODES : Stop : End If
- Copy FDNODE,FDNODE+NSIZE To NODELIST+OBNODE*NSIZE
- ' Print OBNODE;" (ObjectNode)"
- Else
- Copy FDNODE,FDNODE+NSIZE To NODELIST+EXTNODECNT*NSIZE
- If EXTNODECNT>MXEXTNODES : Stop : End If
- Inc EXTNODECNT
- ' Print OBNODE;" (ExtBNode)"
- End If
- Add FDNODE,NSIZE
- Dec NUMNODES
- ' Wait Key
- Wend
- Print EXTNODECNT
- End If
- If ID= Extension_8_0998("OBJC")
- XXX=Free
- Print Extension_8_08D2(ID);" (";STBLK;"=";Leek(ST+8);")"
- PAROBJ=Leek(ST+12)
- Print "Parent:";PAROBJ
- ' Print "Next :";Leek(ST+16)
- ' Print "Prev :";Leek(ST+20)
- FDOBJ=ST+24
- While FDOBJ<ST+2022
- OBNODE=Leek(FDOBJ+4)
- Exit If OBNODE=0
- ' PROT=Leek(FDOBJ+8) xor $F
- ' DATBLK=Leek(FDOBJ+12)
- ' SIZE=Leek(FDOBJ+16)
- ' DATE=Leek(FDOBJ+20)
- ' BITS=Peek(FDOBJ+24)
- NAME$=Peek$(FDOBJ+25,100,Chr$(0))
- COMMENT$=Peek$(FDOBJ+25+Len(NAME$)+1,100,Chr$(0))
- Print NAME$;" ";
- ' If BITS and 128
- ' Print NAME$;Space$(40-Len(NAME$));" <DIR> ";Object Protection$(PROT);" ";COMMENT$
- ' Else
- ' Print NAME$;Space$(40-Len(NAME$));Lsstr$(SIZE,8);" ";Object Protection$(PROT);" ";COMMENT$
- ' End If
- If OBNODE>MXNODES : Stop : End If
- Loke FDOBJ,PAROBJ
- Copy FDOBJ,FDOBJ+26 To OBJLIST+OBNODE*30
- Loke OBJLIST+OBNODE*30+26,STROFF
- FEND=2+Len(NAME$)+Len(COMMENT$)
- Copy FDOBJ+25,FDOBJ+25+FEND To STRBUF+STROFF
- Add STROFF,FEND
- Add FDOBJ,25+FEND
- Add FDOBJ,FDOBJ and 1
- ' Wait Key
- Wend
- Print " ";STROFF
- End If
- Inc STBLK
- If(STBLK mod 40000)=0
- Print(STBLK*400)/NUMBLK;"%"
- End If
- Until STBLK*4>NUMBLK
- End If
- Print
- Loop
- Dev Close
- End
- EXAMINE:
- PAROBJ=Leek(FDOBJ)
- D$=""
- While PAROBJ<>0
- PARADR=OBJLIST+PAROBJ*30
- If Leek(PARADR+4)=PAROBJ
- D$=Peek$(STRBUF+Leek(PARADR+26),100,Chr$(0))+"/"+D$
- PAROBJ=Leek(PARADR)
- Else
- If PAROBJ=52 or(PAROBJ>30000) and(PAROBJ<41000)
- Return
- End If
- D$="BadDir"+ Extension_8_0EB8(PAROBJ,8)+"/"+D$
- Exit
- End If
- Wend
- D$="USR:"+D$
- If Len(D$)>100 : D$="USR:Lost+Found/" : End If
- Trap FOO=Exist(D$)
- If Errtrap : D$="USR:Lost+Found/" : End If
- If Not Exist(D$)
- CNT=0 : POS=0
- Do
- POS=Instr(D$,"/",POS+1)
- Exit If POS=0
- ND$=Left$(D$,POS)
- If Not Exist(ND$)
- Mkdir Extension_8_03E0(ND$)
- End If
- Loop
- End If
- PROT=Leek(FDOBJ+8) xor $F
- DATBLK=Leek(FDOBJ+12)
- SIZE=Leek(FDOBJ+16)
- DATE=Leek(FDOBJ+20)
- BITS=Peek(FDOBJ+24)
- NAME$=Peek$(STRBUF+Leek(FDOBJ+26),100,Chr$(0))
- COMMENT$=Peek$(STRBUF+Leek(FDOBJ+26)+Len(NAME$)+1,100,Chr$(0))
- If BITS and 128
- Print NAME$;Space$(40-Len(NAME$));" <DIR> "; Extension_8_0728(PROT);" ";COMMENT$
- If Not Exist(D$+NAME$)
- Mkdir D$+NAME$
- End If
- Extension_8_0798 D$+NAME$,COMMENT$
- Extension_8_0780 D$+NAME$,PROT
- DD=DATE/(60*60*24)
- TT1=(DATE/60) mod(24*60)
- TT2=(DATE mod 60)*50
- Extension_8_16F8 D$+NAME$,DD, Extension_8_0946(TT1)+TT2
- Else
- Gosub SAVFILE
- End If
- Return
- SAVFILE:
- Print NAME$;Space$(40-Len(NAME$)); Extension_8_0EC8(SIZE,8);" "; Extension_8_0728(PROT);" ";COMMENT$
- FDNODE=NODELIST+OBNODE*14
- OBNODE=Leek(FDNODE+8) and $7FFFFFFF
- If Exist(D$+NAME$)
- Return
- CNT=1
- Repeat
- NN$=NAME$+"."+(Str$(CNT)-" ")
- Inc CNT
- Until Not Exist(D$+NN$)
- NAME$=NN$
- End If
- If OBNODE<>A
- Print "Node";OBNODE;" not found. Save anyway? (y/n)"
- Repeat
- I$=Inkey$ : Multi Wait
- Until I$="y" or I$="n"
- If I$="y"
- Open Out 1,D$+NAME$
- STBLK=DATBLK
- While SIZE>0
- Print ".";
- DISKREAD[ST,2048,BASE+STBLK*4]
- Extension_8_17B6 1,ST To ST+Min(2048,SIZE)
- Add SIZE,-2048
- Inc STBLK
- Wend
- Close 1
- Print
- Extension_8_0798 D$+NAME$,COMMENT$
- Extension_8_0780 D$+NAME$,PROT
- DD=DATE/(60*60*24)
- TT1=(DATE/60) mod(24*60)
- TT2=(DATE mod 60)*50
- Extension_8_16F8 D$+NAME$,DD, Extension_8_0946(TT1)+TT2
- End If
- Else
- STBLK=Leek(FDNODE)
- AMTBLK=Deek(FDNODE+12)
- NXTBLK=Leek(FDNODE+4)
- Open Out 1,D$+NAME$
- While SIZE>0
- Print ".";
- DISKREAD[ST,2048,BASE+STBLK*4]
- Extension_8_17B6 1,ST To ST+Min(2048,SIZE)
- Add SIZE,-2048
- Exit If SIZE<=0
- Inc STBLK
- Dec AMTBLK
- If AMTBLK=0
- If NXTBLK<>0
- For NN=MXNODES To MXEXTNODES
- NNODE=NODELIST+NN*14
- Exit If Leek(NNODE)=NXTBLK
- Next
- If NN=MXEXTNODES
- Print "Node list broken!" : Wait Key
- Close 1 : Return
- End If
- Print "next blocknode..."
- FDNODE=NODELIST+NN*14
- STBLK=Leek(FDNODE)
- AMTBLK=Deek(FDNODE+12)
- NXTBLK=Leek(FDNODE+4)
- Else
- Print "Out of blocks!" : Wait Key
- Close 1 : Return
- End If
- End If
- Wend
- Close 1
- Print
- Extension_8_0798 D$+NAME$,COMMENT$
- Extension_8_0780 D$+NAME$,PROT
- DD=DATE/(60*60*24)
- TT1=(DATE/60) mod(24*60)
- TT2=(DATE mod 60)*50
- Extension_8_16F8 D$+NAME$,DD, Extension_8_0946(TT1)+TT2
- End If
- Return
- End
- Procedure DISKREAD[AD,LE,OS]
- IO=Dev Base(0)
- Loke IO+36,LE : Loke IO+40,AD : Loke IO+44,OS*512
- Dev Do 0,2
- End Proc
- Procedure DISKWRITE[AD,LE,OS]
- IO=Dev Base(0)
- Loke IO+36,LE : Loke IO+40,AD : Loke IO+44,OS*512
- Dev Do 0,3
- End Proc
- Procedure DISKFLUSH
- Dev Do 0,4
- End Proc